#include<bits/stdc++.h>
#define N 100005
using namespace std;
int d;
int T;
struct nd
{
    int a,b;
    nd(int a=0,int b=0):a(a),b(b){}
    bool operator<(nd k)
    {
        return a<k.a;
    }
}cj[N];
int v,a,p[N];
int chao[N*10][11];
int det[N*10][11];
vector<int>st;
void solve()
{
    st.clear();
    int n,m,L,V;
    cin>>n>>m>>L>>V;
    for(int i=1;i<=n;i++)
    {
        cin>>d>>v>>a;
        if(v>V)
        {
            if(a>=0)
            {
                cj[i].a=d;
                cj[i].b=L;
            }
            else
            {
                int dk=d+(int)ceil((V*V-v*v)/2/a)-1;
                cj[i].a=d;
                cj[i].b=min(L,dk);
            }
        }
        else
        {
            if(a>0)
            {
                int dk=d+(int)ceil((V*V-v*v)/2/a)+1;
                if(dk<L)
                {
                    cj[i].a=dk;
                    cj[i].b=L;
                }
                else
                {
                    cj[i].a=0;
                    cj[i].b=0;
                }
            }
            else
            {
                cj[i].a=0;
                cj[i].b=0;
            }
        }
    }
    for(int i=1;i<=m;i++)
    {
        cin>>p[i];
        det[p[i]][T]=1;
    }
    for(int i=1;i<=L;i++)
    {
        det[i][T]+=det[i-1][T];
    }
    int ans1=0,ans2=0;
    for(int i=1;i<=n;i++)
    {
        if(det[cj[i].b][T]-det[cj[i].a-1][T])ans1++,st.push_back(i);
    }
    for(int i=1;i<=m;i++)
    {
        int cnn=0;
        for(int j=0;j<st.size();j++)
        {
            if(st[j]==-1)continue;
            if(cj[st[j]].a<=p[i]&&p[i]<=cj[st[j]].b)
            {
                st[j]=-1;
                cnn++;
            }
        }
        if(cnn!=0)continue;
        ans2++;
    }
    cout<<ans1<<" "<<ans2<<endl;
}
int main()
{
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    cin>>T;
    while(T--)
    {
        solve();
    }
    return 0;
}
